package org.zhao.nettydemos.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

/**
 * 用来模拟handler业务处理器的各个方法执行顺序和生命周期
 */
@Slf4j
public class InHandlerDemo extends ChannelInboundHandlerAdapter {

    /**
     * 当业务处理器被加入到流水线后 ， 此方法将被回调
     * 也就是ch.pipeline().addLast(handler)语句后会回调handlerAdded
     * @param ctx
     * @throws Exception
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception{
        log.info("被调用 : handlerAdded() ");
        super.handlerAdded(ctx);
    }

    /**
     * 当通道成功绑定一个NioEventLoop反应器后， 此方法会被回调
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelRegistered(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 channelRegistered()");
        super.channelRegistered(ctx);
    }

    /**
     * 通道激活会被回调 ， 是指所有的业务处理器添加、注册的异步任务完成，并且与NioEventLoop反应器绑定的异步任务完成
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 channelActive()");
        super.channelActive(ctx);
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception{
        log.info("被调用 channelRead()");
        super.channelRead(ctx,msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 channelReadComplete");
        super.channelReadComplete(ctx);
    }

    /**
     *  当通道的底层连接已经不是ESTABLISH状态或者底层连接已经关闭 ， 会回调此方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 channelInactive()");
        super.channelInactive(ctx);
    }

    /**
     * 通道和NioEventLoop反应器解除绑定 ， 移除对这条通道的事件处理之后 ， 会回调此方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelUnregistered(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 channelUnregistered()");
        super.channelUnregistered(ctx);
    }

    /**
     * netty会移除通道上的所有的业务处理器
     * @param ctx
     * @throws Exception
     */
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx)throws Exception{
        log.info("被调用 handlerRemoved()");
        super.handlerRemoved(ctx);
    }



}
